// データベース変数
var tester_db = null;

var response_dlg = null;

var msg = function(txt){
    $.jGrowl.defaults.position = 'bottom-left';
    $.jGrowl(txt, {});
}

// プロジェクトリストを更新する
var refresh_prj_list = function(){
    $("#prj_list").empty();
    var sql = 'select name from project';
    var rs = tester_db.execute(sql);
    while (rs.isValidRow()) {
        var name = rs.field(0);
        $("#prj_list").append(['<option value="',name,'">',name,'</option>'].join(''));
        rs.next();
    }
    rs.close();
}

// ヘダーとパラメーターを追加する。
var add_case_option = function(type, name, value){
    // header
    if(type == 'h'){
        var tr = $("#header_list_tb").children("tbody").children(":last");
        tr = tr.clone().insertBefore(tr);
        var nameEl = tr.find("input[class='header_name']");
        var valEl = tr.find("input[class='header_value']");
        nameEl.val(name);
        valEl.val(value);
    } 
    // parameters
    else if(type == 'p'){
        var tr = $("#param_list_tb").children("tbody").children(":last");
        tr = tr.clone().insertBefore(tr);
        var nameEl = tr.find("input[class='param_name']");
        var valEl = tr.find("input[class='param_value']");
        nameEl.val(name);
        valEl.val(value);
    } 
}

//ヘダーとパラメーターを追加する。
var remove_case_option = function(type){
    // header
    if(type == 'h'){
        var tr = $("#header_list_tb").children("tbody").children().each(function(idx, el){
            if(idx == 0){
                var nameEl = $(el).find("input[class='header_name']");
                var valEl = $(el).find("input[class='header_value']");
                nameEl.val("");
                valEl.val("");
            } else {
                $(el).remove();
            }
        });
    } 
    // parameters
    else if(type == 'p'){
        var tr = $("#param_list_tb").children("tbody").children().each(function(idx, el){
            if(idx == 0){
                var nameEl = $(el).find("input[class='param_name']");
                var valEl = $(el).find("input[class='param_value']");
                nameEl.val("");
                valEl.val("");
            } else {
                $(el).remove();
            }
        });
    } 
}


// テストケースリストを更新する。
var refresh_case_list = function(project){
    $("#case_list").empty();
    var sql = 'select t.case_name from use_case t where t.project = ?';
    var rs = tester_db.execute(sql, [project]);
    while (rs.isValidRow()) {
        var name = rs.field(0);
        $("#case_list").append(['<option value="',name,'">',name,'</option>'].join(''));
        rs.next();
    }
    rs.close();
}


// データベース初期化
var init_db = function(){
    var create_sql_1 = ['CREATE TABLE if not exists [project](',
                      '[name] varchar(255) PRIMARY KEY NOT NULL',
                      ');'].join('');
    var create_sql_2 = ['CREATE TABLE if not exists [use_case](',
                      '[project] varchar(255) NOT NULL',
                      ',[case_name] varchar(255) NOT NULL',
                      ',[url] text',
                      ',[file] text',
                      ',[content_type] varchar(255)',
                      ',[post_body] text',
                      ', Primary Key(project,case_name)   ',
                      ');'].join('');
    var create_sql_3 = ['Create TABLE if not exists [case_option](',
                        '[id] integer PRIMARY KEY AUTOINCREMENT',
                        ',[case] varchar(255) NOT NULL',
                        ',[project] varchar(255) NOT NULL',
                        ',[type] char(1)',
                        ',[key_name] varchar(255)',
                        ',[key_value] text',
                        ');'].join('')

    var create_sql_4 = ['CREATE INDEX if not exists [idx_prj_case] On [case_option] (',
                        '[case] ,',
                        '[project] ) ;'].join('');
    
    if(tester_db == null){
        tester_db = google.gears.factory.create('beta.database');
        tester_db.open('tester_db');
        tester_db.execute(create_sql_1);
        tester_db.execute(create_sql_2);
        tester_db.execute(create_sql_3);
        tester_db.execute(create_sql_4);
    }
}

// Gearsリクエストを作成する。
var getRequest = function(){
    var request = google.gears.factory.create('beta.httprequest');
    return request;
}

// 文字列は空かどうかを判断する。
var is_empty = function(str) {
    if(str == null || str == undefined || str.trim() == ""){
        return true;
    } else {
        return false;
    }
}

var set_header = function(req) {
    var tr = $("#header_list_tb").children("tbody").children().each(function(idx, el){
        var nameEl = $(el).find("input[class='header_name']");
        var valEl = $(el).find("input[class='header_value']");
        if(!is_empty(nameEl.val())){
            req.setRequestHeader(nameEl.val(), valEl.val());
        }
    });
}

// 画面初期化時
$(function() {
    // Gearsをチェックする
    if (!window.google || !google.gears) {
        location.href = "http://gears.google.com/?action=install&message=you must install gears"
                + "&return="+window.location;
    } else {
        init_db();
        
        // タブの初期化
        $("#param_content").tabs();
        
        // プロジェクトの選択イベント
        $("#prj_list").select(function(){
            var prj_id = $(this).val()
        });

        // テストケースの選択イベント
        $("#case_list").select(function(){
            var prj_id = $("#prj_list").val();
            var case_id = $(this).val();
        });
        
        // POST
        $("#post_btn").click(function(){
            var url = $("#url_txt").val();
            var request = getRequest();
            request.open('POST', url);
            request.onreadystatechange = function() {
                if (request.readyState == 4) {
                    $('#response_body').text('');
                    $('#response_body').text(request.responseText)
                    response_dlg.dialog('open');
                }
            };
            request.setRequestHeader('Content-Type',$("#post_content_type").val())
            set_header(request);
            request.send($("#param_body_txt").val());
        });
        
        // GET
        $('#get_btn').click(function(){
            var url = $("#url_txt").val();
            var request = getRequest();
            if(url.indexOf('?') < 0){
                url = url + '?';
            } else {
                url = url + '&';
            }
            url = url + $("#param_body_txt").val();
            request.open('GET', url);
            request.onreadystatechange = function() {
                if (request.readyState == 4) {
                    $('#response_body').text('');
                    $('#response_body').text(request.responseText)
                    response_dlg.dialog('open');
                }
            };
            request.setRequestHeader('Content-Type',$("#post_content_type").val())
            set_header(request);
            request.send();
        });
        
        // パラメーター追加
        $("#param_add").click(function(){
            var tr = $("#param_list_tb").children("tbody").children(":last");
            tr.clone().insertAfter(tr);
        });

        // パラメーター削除
        $("#param_del").click(function(){
            var tr = $(".param_sel:checked").each(function(idx, domEl){
                if($(".param_sel").length > 1){
                    $(domEl).parent().parent().remove();
                }
            });
        });
        
        // ヘダー追加
        $("#header_add").click(function(){
            var tr = $("#header_list_tb").children("tbody").children(":last");
            tr.clone().insertAfter(tr);
        });
        
        // ヘダー削除
        $("#header_del").click(function(){
            var tr = $(".header_sel:checked").each(function(idx, domEl){
                if($(".header_sel").length > 1){
                    $(domEl).parent().parent().remove();
                }
            });
        });
        
        // POSTデータを作成する。
        $("#param_body_btn").click(function(){
            var params = {};
            $("#param_list_tb").children("tbody").children("tr").each(function(idx, domEl){
                var tr = $(domEl);
                var nameEl = tr.find("input[class='param_name']");
                var valEl = tr.find("input[class='param_value']");
                var name = nameEl.val();
                if(!is_empty(name)){
                    if(params[name] != null){
                        params[name].push(valEl.val());
                    } else {
                        params[name] = [valEl.val()];
                    }
                }
            });
            var str = $.param(params);
            $("#param_body_txt").val(str);
        });
        
        // テストケースを保存する。
        $("#save_btn").click(function(){
            var prj = $("#prj_list").val();
            var test_case = $("#case_list").val();
            if(prj != null && test_case != null){
                var sql_1 = 'update use_case set url = ?, file = ?, content_type = ?, post_body = ? where project = ? and case_name = ?';
                tester_db.execute(sql_1, [$("#url_txt").val(),
                                          $("#post_file").val(),
                                          $("#post_content_type").val(),
                                          $("#param_body_txt").val(),
                                          prj,
                                          test_case]);
                var sql_2 = 'delete from case_option where project = ? and [case] = ?';
                tester_db.execute(sql_2, [prj, test_case]);
                
                var sql_3 = 'insert into case_option (project, [case], type, key_name, key_value) values (?, ?, ?, ?, ?)';
                $("#param_list_tb").children("tbody").children("tr").each(function(idx, domEl){
                    var tr = $(domEl);
                    var nameEl = tr.find("input[class='param_name']");
                    var valEl = tr.find("input[class='param_value']");
                    var name = nameEl.val();
                    if(!is_empty(name)){
                        var val = valEl.val();
                        tester_db.execute(sql_3, [prj, test_case, 'p', name, val]);
                    }
                });

                $("#header_list_tb").children("tbody").children("tr").each(function(idx, domEl){
                    var tr = $(domEl);
                    var nameEl = tr.find("input[class='header_name']");
                    var valEl = tr.find("input[class='header_value']");
                    var name = nameEl.val();
                    if(!is_empty(name)){
                        var val = valEl.val();
                        tester_db.execute(sql_3, [prj, test_case, 'h', name, val]);
                    }
                });
                
                msg("Test case save success!");
            }
        });
        
        // プロジェクトを追加する。
        $("#prj_list_add").click(function(){
            var name = prompt("Please Input Project Name：","");
            if(name != null){
                var sql = 'insert into project (name) values (?)';
                tester_db.execute(sql, [name]);
                if(tester_db.rowsAffected > 0){
                    refresh_prj_list();
                } else {
                    msg('Prject Insert Failure!');
                }
            }
        });
        
        // プロジェクトを削除する。
        $("#prj_list_del").click(function(){
            var prj = $("#prj_list").val();
            if(prj != null){
                var sql = 'delete from project where name = ?';
                tester_db.execute(sql, [prj]);
                refresh_prj_list();
                refresh_case_list();
            }
        });
        
        // プロジェクトを選択する。
        $("#prj_list").change(function(){
            var project = $(this).val();
            if(project != null){
                refresh_case_list(project);
            }
        });
        
        //
        $("#case_list_add").click(function(){
            var prj = $("#prj_list").val();
            if(prj != null){
                var name = prompt("Please input case name for project " + prj + "：","");
                if(name != null){
                    var sql = 'insert into use_case (project, case_name) values (?, ?)';
                    tester_db.execute(sql, [prj, name]);
                    if(tester_db.rowsAffected > 0){
                        refresh_case_list(prj);
                        $("#case_list").val(name);
                        $("#case_list").change();
                    } else {
                        msg('Test Case Insert Failure!');
                    }
                }
            }
        });
        
        //
        $("#case_list_del").click(function(){
            var prj = $("#prj_list").val();
            var test_case = $("#case_list").val();
            if(prj != null && test_case != null){
                var sql_1 = 'delete from case_option where [case] = ? and project = ?';
                var sql_2 = 'delete from use_case where case_name = ? and project = ?';
                tester_db.execute(sql_1, [test_case, prj]);
                tester_db.execute(sql_2, [test_case, prj]);
                refresh_case_list(prj);
            }
        });
        
        //　テストケースリストを選択するとき
        $("#case_list").change(function(){
            var sql_1  = ['SELECT ',
                        '  t.project , ',
                        '  t.case_name , ',
                        '  t.url , ',
                        '  t.file , ',
                        '  t.content_type , ',
                        '  t.post_body ',
                        'FROM ',
                        '  use_case t ',
                        'WHERE ',
                        '  t.project = ? AND t.case_name = ?'].join('\n');
            var sql_2 = ['SELECT ',
                         '  t.type , ',
                         '  t.key_name , ',
                         '  t.key_value ',
                         'FROM ',
                         '  case_option t ',
                         'WHERE ',
                         '  t.project = ? AND t.[case] = ? ;'].join('\n');
            
            var prj = $("#prj_list").val();
            var use_case = $(this).val();
            if(prj != null && use_case != null){
                var rs1 = tester_db.execute(sql_1, [prj, use_case]);
                if(rs1.isValidRow()){
                    $("#url_txt").val(rs1.fieldByName('url'));
                    $("#post_content_type").val(rs1.fieldByName('content_type'));
                    $("#param_body_txt").val(rs1.fieldByName('post_body'));
                }

                remove_case_option('h');
                remove_case_option('p');
                var rs2 = tester_db.execute(sql_2, [prj, use_case]);
                while (rs2.isValidRow()) {
                    var type = rs2.fieldByName('type');
                    var name = rs2.fieldByName('key_name');
                    var value = rs2.fieldByName('key_value');
                    add_case_option(type, name, value);
                    rs2.next();
                }
            }
        });
        
        //　画面初期化とき、プロジェクトリストを初期化する。
        refresh_prj_list();
        
        response_dlg = $('#dlg').dialog({ 
            autoOpen        : false,
            closeOnEscape   : true,
            title           : 'Response',
            width           : 600,
            buttons         : { 
                "OK"    : function() { 
                    $(this).dialog("close"); 
                 }
            }
        });
    }
});